home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
BMUG Revelations
/
BMUG Revelations.toast
/
Programming
/
Programming Languages
/
Yerk 3.64
/
Asm source
/
GetOp
< prev
next >
Wrap
Text File
|
1991-06-16
|
5KB
|
147 lines
\ GetOp Reese Warner 3/85
\ 12/17/85 JAF created Symbols <SUPER Dictionary to deal w/ valid 0 values
\ 03/06/86 GDC fixed immediate mode
\ 03/07/86 GDC fixed displacement
\ 03/07/86 GDC fixed PC modes (9 & 10)
\ The Dreaded GetOp - builds the operand structure
25 Symbols SymTab \ jaf 12/17/85 change Dictionary to Symbols
0 -> dlevel
\ finds operand size
: ExtSize { addr len \ size -- Size }
addr c@
CASE
ascii L OF 2 -> Size ENDOF
ascii W OF 1 -> Size ENDOF
ascii B OF 0 -> Size ENDOF
202 AsmError \ bad operand size
ENDCASE
size val" ExtSize returns "
;
: GetSize { \ Size tt -- tokenType size }
opSize -> size
nextToken -> tt
" ," get: token s=
IF
nextToken -> tt
THEN
start: token
" ." indexOf: token
IF
drop ( charOf ) nextToken drop msg" EXEC IF"
get: token extSize -> size
nextToken -> tt
THEN
tt val" tt="
size val" size="
;
: ClearOp { opPtr -- }
0 seta/d: opPtr
0 setauxsize: opPtr
0 setReg: opPtr
0 setval: opPtr
0 setmode: opPtr
0 setauxreg: opPtr
0 setpcmode: opPtr
;
: GetOp { opPtr \ opDesc type -- }
opptr clearOp
getSize -> opSize -> type
type 1 = \ check for 5 or 6 mode, tokentype 1
IF
get: token >num setVal: opPtr
nextToken drop
token query: operands -> opDesc
opDesc 0=
IF
203 AsmError \ unknown operand
ELSE
mode: opDesc 2 = mode: opDesc 6 = or
mode: opDesc 9 = or mode: opDesc 10 = or
IF
mode: opDesc dup setpcmode: opPtr
7 min val" setMode to" setMode: opPtr
mode: opPtr 2 = IF 5 setMode: opPtr THEN
reg: opDesc val" setReg to" setReg: opPtr
mode: opDesc 6 = mode: opDesc 10 = or
IF
nextToken drop \ should be comma
nextToken drop token query: operands -> opDesc
mode: opDesc 20 = mode: opDesc 21 = or
IF
reg: opDesc setAuxReg: opPtr
mode: opDesc 20 - val" a/d to" setA/D: opPtr
1 setAuxSize: opPtr
ELSE
nextToken 3 = \ should be '.', len associated with
\ idx reg
IF
reg: opDesc setAuxReg: opPtr
mode: opDesc setA/D: opPtr
nextToken drop get: token extSize setAuxSize: opPtr
ELSE
203 asmError \ unknown operand
THEN
THEN
THEN
ELSE
203 AsmError \ unknown operand
THEN
THEN
ELSE
token query: operands -> opDesc
opDesc 0= val" T means Label " \ if operand is a label
IF \ label, presumably
pass 1 =
IF
token query: symTab
swap drop \ jaf 12/17/85 remove val
0=
IF
0 token enter: symTab
THEN
ELSE \ Put code location into value field
Token query: symTab
drop \ jaf 12/17/85 remove flag
codePos - 2- setVal: opPtr
THEN
9 setMode: opPtr
2 setReg: opPtr
ELSE
reg: opDesc val" reg is " setReg: opPtr
mode: opDesc val" mode is " setMode: opPtr
mode: opPtr 11 = \ an Immediate operand
IF
nextToken
1 =
IF
get: token >num setVal: opPtr
ELSE
205 asmError
THEN
THEN
mode: opPtr 8 = \ a dict pointer,compile an immediate
IF
11 setMode: opPtr
4 setReg: opPtr
nextToken drop
nextToken drop get: token str255 -base latest (find)
IF
drop
setVal: opPtr
ELSE
216 asmError
THEN
nextToken drop
THEN
THEN
THEN
;